package Traductor.Sintactico;

import java.util.*;
import Traductor.Sintactico.Simbolo.TipoVar;

public class Comprobar {
	
	private HashMap<String, TipoVar[][]> resOp;
	
	public Comprobar(){
		resOp = new HashMap<String, TipoVar[][]>();
		resOp.put("comp", tabComp());
		resOp.put("srdm", tabSRMD());
		resOp.put("yo", tabYO());
		resOp.put("mod", tabMOD());
		resOp.put("desp", tabDESP());
	}

	private TipoVar[][] tabComp() {
		TipoVar[][] tCmp = iniciaTabla();
		for(int i=0; i<3; i++)
			for(int j=0; j<3; j++)
				tCmp[i][j] = TipoVar.booleano;
		tCmp[3][3] = TipoVar.booleano;
		tCmp[4][4] = TipoVar.booleano;
		return tCmp;
	}

	private TipoVar[][] tabSRMD() {
		TipoVar[][] tsrmd = iniciaTabla();
		tsrmd[0][0] = TipoVar.natural;
		tsrmd[0][1] = TipoVar.entero;
		tsrmd[1][1] = TipoVar.entero;
		tsrmd[1][0] = TipoVar.entero;
		tsrmd[0][2] = TipoVar.real;
		tsrmd[1][2] = TipoVar.real;
		tsrmd[2][0] = TipoVar.real;
		tsrmd[2][1] = TipoVar.real;
		tsrmd[2][2] = TipoVar.real;
		return tsrmd;
	}
	
	private TipoVar[][] tabYO() {
		TipoVar[][] tyo = iniciaTabla();
		tyo[3][3] = TipoVar.booleano;
		return tyo;
	}

	private TipoVar[][] tabMOD() {
		TipoVar[][] tmod = iniciaTabla();
		tmod[0][0] = TipoVar.natural;
		tmod[1][0] = TipoVar.entero;
		return tmod;
	}
	
	private TipoVar[][] tabDESP() {
		TipoVar[][] tdesp = iniciaTabla();
		tdesp[0][0] = TipoVar.natural;
		return tdesp;
	}
	
	private TipoVar[][] iniciaTabla(){
		TipoVar[][] tab = new TipoVar[5][5];
		for(int i=0; i<5; i++)
			for(int j=0; j<5; j++)
				tab[i][j] = null;
		return tab;
	}
	
	private int convierte(TipoVar tvar){
		if(tvar.equals(TipoVar.natural)) return 0;
		else if(tvar.equals(TipoVar.entero)) return 1;
		else if(tvar.equals(TipoVar.real)) return 2;
		else if(tvar.equals(TipoVar.booleano)) return 3;
		else return 4;
	}
	
	// Arreglar esto porque dos tipos punteros se pueden comparar con == y !=
	public TipoVar dameResultado(TipoVar tvar1, TipoVar tvar2, String op){
		TipoVar[][] t;
		if(tvar1.equals(TipoVar.puntero) && tvar2.equals(TipoVar.puntero) && (op.equals("!=")||op.equals("==")))
			return TipoVar.puntero;
		if(tvar1.equals(TipoVar.array) || tvar2.equals(TipoVar.array) || 
				tvar1.equals(TipoVar.puntero) || tvar2.equals(TipoVar.puntero) || 
				tvar1.equals(TipoVar.registro) || tvar2.equals(TipoVar.registro)){
			return null;
		}
		if(op.equals("+") || op.equals("-") || op.equals("*") || op.equals("/")){
			t = resOp.get("srdm");
			return t[convierte(tvar1)][convierte(tvar2)];
		}
		if(op.equals("<<") || op.equals(">>")){
			t = resOp.get("desp");
			return t[convierte(tvar1)][convierte(tvar2)];
		}
		if(op.equals("%")){
			t = resOp.get("mod");
			return t[convierte(tvar1)][convierte(tvar2)];
		}
		else if(op.equals("y") || op.equals("o")){
			t = resOp.get("yo");
			return t[convierte(tvar1)][convierte(tvar2)];
		}
		else{
			t = resOp.get("comp");
			return t[convierte(tvar1)][convierte(tvar2)];
		}
	}
	
}
